<?php

class ComunicadoService extends Model {

    /**
     * @var ComunicadoDao
     */
    private $comunicadoDao;
    /**
     * @var ClienteService
     */
    private $clienteService;

    public function injectDependencies() {
        $this->comunicadoDao = ComunicadoDao::getInstance();
        $this->clienteService = ClienteService::getInstance();
    }

    public function findAllAnnouncements() {
        $ArComunicados = $this->comunicadoDao->findAll();
        $this->fillAnnouncement($ArComunicados);
        return $ArComunicados;
    }

    public function findById($IDComunicacao) {
        $Comunicado = $this->comunicadoDao->findById($IDComunicacao);
        $this->fillAnnouncement($Comunicado);
        return $Comunicado;
    }

    public function findCommunicationsByCustomer($IDCliente) {
        return $this->comunicadoDao->findCommunicationsByCustomer($IDCliente);
    }

    public function generateAnnouncementReport() {
        $ArCustomers = $this->clienteService->findAll();
        $ArAnnouncementReport = array();
        foreach ($ArCustomers as $Customer) {
            $ArAnnouncementReport[] = array(
                'Customer' => $Customer,
                'Announcement' => $this->comunicadoDao->countAnnouncementByCustomer($Customer->getIDCliente())
            );
        }
        return $ArAnnouncementReport;
    }

    public function generateAnnouncementTypeReport() {
        return array(
            'ELOGIO' => $this->comunicadoDao->countNumberOfAnnouncementByType('ELOGIO'),
            'ERRO' => $this->comunicadoDao->countNumberOfAnnouncementByType('ERRO'),
            'SUGESTAO' => $this->comunicadoDao->countNumberOfAnnouncementByType('SUGESTAO')
        );
    }

    private function fillAnnouncement(&$MxComunicado) {

        if (!empty($MxComunicado)) {
            $this->fillAnnouncementWithCustomer($MxComunicado);
        }
    }

    private function fillAnnouncementWithCustomer(&$MxComunicado) {
        if (!is_array($MxComunicado)) {
            $MxComunicado->setCliente($this->clienteService->findById($MxComunicado->getIDCliente()));
            return;
        }
        foreach ($MxComunicado as &$Comunicado) {
            $Comunicado->setCliente($this->clienteService->findById($Comunicado->getIDCliente()));
        }
    }

}

?>
